import pymysql  
  
# 源数据库配置  
source_config = {  
    'host': 'source_host',  
    'user': 'source_user',  
    'password': 'source_password',  
    'database': 'source_database',  # 你可以设置为None，然后在循环中动态设置  
    'charset': 'utf8mb4',  
    'cursorclass': pymysql.cursors.DictCursor  
}  
  
# 目标数据库配置  
target_config = {  
    'host': 'target_host',  
    'user': 'target_user',  
    'password': 'target_password',  
    'charset': 'utf8mb4',  
    'cursorclass': pymysql.cursors.DictCursor  
}  
  
def copy_databases(source_config, target_config):  
    # 连接到源数据库  
    with pymysql.connect(**source_config) as source_conn:  
        with source_conn.cursor() as source_cursor:  
            # 获取源数据库中的所有数据库列表  
            source_cursor.execute("SHOW DATABASES;")  
            databases = source_cursor.fetchall()  
              
            # 遍历每个数据库  
            for db in databases:  
                db_name = db['Database']  
                if db_name not in ['information_schema', 'mysql', 'performance_schema', 'sys']:  # 排除系统数据库  
                    print(f"Copying {db_name}...")  
                      
                    # 连接到目标数据库（如果尚不存在，则创建）  
                    target_conn = pymysql.connect(**{**target_config, 'database': db_name})  
                    try:  
                        with target_conn.cursor() as target_cursor:  
                            # 获取源数据库中的表列表  
                            source_cursor.execute(f"USE {db_name}; SHOW TABLES;")  
                            tables = source_cursor.fetchall()  
                              
                            # 遍历每个表  
                            for table in tables:  
                                table_name = table['Tables_in_' + db_name]  
                                print(f"Copying {db_name}.{table_name}...")  
                                  
                                # 在目标数据库中创建表结构  
                                source_cursor.execute(f"USE {db_name}; SHOW CREATE TABLE {table_name};")  
                                create_table_sql = source_cursor.fetchone()[1]  
                                target_cursor.execute(f"USE {db_name}; {create_table_sql}")  
                                  
                                # 将数据从源数据库复制到目标数据库  
                                source_cursor.execute(f"USE {db_name}; SELECT * FROM {table_name};")  
                                rows = source_cursor.fetchall()  
                                if rows:  
                                    target_cursor.executemany(f"USE {db_name}; INSERT INTO {table_name} VALUES (%s, %s, %s, ...)", [row.values() for row in rows])  # 注意：这里的%s数量需要根据实际的表结构来调整  
                                    target_conn.commit()  
                    finally:  
                        target_conn.close()  
  
# 开始复制数据库  
copy_databases(source_config, target_config)